#include "mem.h"

#define MEM_TEMPLATE    template<                               \
                            typename word_t  /* 机器字长 */    \
                        >

#define MEM_CLASS       MEM<word_t>

MEM_TEMPLATE
word_t* MEM_CLASS::get_memory()
{
    return (word_t *)memory;
} 

MEM_TEMPLATE
word_t MEM_CLASS::get_memsize()
{
    return UINT16_MAX;
}

/**
 * @brief : 
 *      读取内存中的数据 
 * @param : 
 *      word_t addr : 内存单元地址
 * @return : 
 *      word_t : 返回读取的内容
 */
MEM_TEMPLATE
void MEM_CLASS::init() 
{

}

/**
 * @brief : 
 *      读取内存中的数据 
 * @param : 
 *      word_t addr : 内存单元地址
 * @return : 
 *      word_t : 返回读取的内容
 */
MEM_TEMPLATE
word_t MEM_CLASS::read(word_t addr) 
{
    if(MR_KBSR==addr) {
        if( check_key() ) {
            /* 键盘读 */
            memory[MR_KBSR] = (1 << 15);
            memory[MR_KBDR] = read_key();
        }else {
            memory[MR_KBSR] = 0;
        }
    }
    return memory[addr];
}

/**
 * @brief : 
 *      写入内存内存 
 * @param : 
 *      word_t addr : 内存单元地址
 *      word_t data : 待写入的数据
 */
MEM_TEMPLATE
void MEM_CLASS::write(word_t addr, word_t data) 
{
    memory[addr] = data;
}

/** 
 * @brief : 
 *      字节交换，将 16 位数据高低字节进行交换
 *      用于大小端转换
 * @param : 
 *      word_t : 参数一个 16 位的数据
 * @return : 
 *      word_t : 交换后的数据 
 */
MEM_TEMPLATE
word_t MEM_CLASS::swap16(word_t x) {
    return (x << 8) | (x >> 8);
}

MEM_TEMPLATE
word_t* MEM_CLASS::alloc_addr(word_t addr) {
    word_t max_read = UINT16_MAX - addr;
    word_t *p = memory + addr;
    return p;
}
